package io.github.echarts.model.adapter.series;

import io.github.echarts.model.SeriesModel;
import io.github.echarts.model.context.ConfigurationContext;
import io.github.echarts.option.series.SeriesOption;

/**
 * 系列类型适配器接口
 * <p>
 * 该接口定义了不同系列类型的适配逻辑。
 * 每种系列类型（如柱状图、折线图、饼图等）应该有其专门的适配器实现。
 * </p>
 */
public interface SeriesTypeAdapter {
    
    /**
     * 检查该适配器是否支持指定的系列类型
     *
     * @param seriesType 系列类型
     * @return 如果支持则返回true，否则返回false
     */
    boolean supports(String seriesType);
    
    /**
     * 从系列配置创建系列模型
     *
     * @param seriesOption 系列配置
     * @param coordinateSystemId 坐标系ID
     * @param context 配置上下文
     * @return 创建的系列模型
     */
    SeriesModel createModel(SeriesOption seriesOption, String coordinateSystemId, ConfigurationContext context);
    
    /**
     * 获取系列的数据范围优化建议
     *
     * @param seriesModel 系列模型
     * @param context 配置上下文
     * @return 数据范围优化建议
     */
    DataRangeOptimization getDataRangeOptimization(SeriesModel seriesModel, ConfigurationContext context);
    
    /**
     * 优化系列视觉样式
     *
     * @param seriesModel 系列模型
     * @param context 配置上下文
     */
    void optimizeVisualStyle(SeriesModel seriesModel, ConfigurationContext context);
    
    /**
     * 数据范围优化建议
     */
    class DataRangeOptimization {
        private boolean startWithZero = false;
        private boolean includeNegativeAxis = false;
        private double expandPercentage = 0.05;
        
        public boolean isStartWithZero() {
            return startWithZero;
        }
        
        public void setStartWithZero(boolean startWithZero) {
            this.startWithZero = startWithZero;
        }
        
        public boolean isIncludeNegativeAxis() {
            return includeNegativeAxis;
        }
        
        public void setIncludeNegativeAxis(boolean includeNegativeAxis) {
            this.includeNegativeAxis = includeNegativeAxis;
        }
        
        public double getExpandPercentage() {
            return expandPercentage;
        }
        
        public void setExpandPercentage(double expandPercentage) {
            this.expandPercentage = expandPercentage;
        }
    }
} 